package middlewares

import (
	"go_wep_demo/common"
	"go_wep_demo/controllers"
	"go_wep_demo/pkg/jwt"

	"github.com/gin-gonic/gin"
)

// JWTAuthMiddleware 基于JWT的认证中间件
func JWTAuthMiddleware() func(c *gin.Context) {
	return func(c *gin.Context) {
		// 客户端携带Token有三种方式 1.放在请求头 2.放在请求体 3.放在URI
		// 这里假设Token放在Header的token
		// 这里的具体实现方式要依据你的实际业务情况决定
		tokenString := c.Request.Header.Get(common.TokenKey)
		if tokenString == "" {
			controllers.ResponseError(c, controllers.CodeNotToken)
			c.Abort()
			return
		}
		//我们使用之前定义好的解析JWT的函数来解析它
		mc, err := jwt.ParseToken(tokenString)
		if err != nil {
			if err == jwt.ExpireError {
				controllers.ResponseError(c, controllers.CodeNeedLogin)
			} else {
				controllers.ResponseError(c, controllers.CodeInvalidToken)
			}
			c.Abort()
			return
		}
		// 将当前请求的username信息保存到请求的上下文c上
		c.Set(common.ContextUserId, mc.UserId)
		c.Next() // 后续的处理函数可以用过c.Get(ContextUserId)来获取当前请求的用户信息
	}
}
